2

Laravel 框架关键技术解析·读书笔记(一)

第一章
  • 入口文件

请求访问的入口文件,主要完成几部分工作,分别是:

  1. 自动加载函数的添加
  2. 服务器实例化与服务注册
  3. 路由加载
  4. 请求实例化与路由分发
  5. 相应生成与发送

其中,自动加载函数用于包含引用文件,改文件是composer工具自动生成的,直接require关键字添加即可。

在Laravel框架中一些功能的生成都需要服务容器实现,即IlluminateContainerContainer类的实例,服务容器用于服务注册和解析,也就是说向服务容器注册能够实现某些功能的实例或者回调函数,当需要使用该功能时从服务容器中获取相应的实例来完成。

访问网站的根目录,服务器会调用入口文件进行处理,入口文件会通过IlluminateHttpRequest类的静态方法createFormGlobals()实现请求的实例化,然后通过路由进行分发处理,路由会根据请求的地址查找路由表,查找到将通过路由表中对应的相应处理方式进行处理并返回响应。

  • 模型组件

Illuminatedatabase 组件主要用于操作数据库,他提供了两种数据库的方式,一种是查询构造器方式,一种是Eloqument ORM 方式

通过Eloquent ORM 方式操作数据库需要以下工作

  1. 创建数据库
  2. 添加数据库配置信息
  3. 启动Eloquent ORM模块
  4. 创建model类
  5. 通过model类操作数据库

启动Eloquent ORM 模块阶段需要用到数据库的管理类,即IlluminateDatabaseCapsuleManager 类,需要相应初始化,以及数据库相关配置,以完成数据库Eloquent ORM 模块的启动。


第二章(环境搭建)

第三章(框架常用的PHP语法)
  1. 组件开发语法条件

    1. 命名空间
    2. 文件包含
    • 通过composer工具创建依赖管理时,会在vendor目录下创建一个autoload.php文件和一个composer文件夹,其中composer文件夹中包含了类自动加载函数注册的相关实现,而autoload.php文件是对外的接口,通过包含该文件就可以完成类自动加载函数的注册。
    • 【相应问题看源码,没能够有很理解,停留层次较浅】
  2. 匿名函数
  3. 特殊语法

    1. 魔术方法
    2. 魔术常量
  4. 反射

    • 主要用来动态的获取系统中的类、实例对象、方法等语言结构的信息,通过反射API函数可以实现对这些语言构件信息的动态获取和动态操作等(PHP5具有完整的反射API,添加了对类、接口、函数、方法和扩展进行反向工作的能力)
    • 在laravel框架中,服务容器解析服务的过程中就用到了反射机制
    ##文件 : Illuminate\Container\Container.php

在Laravel框架中,解析服务是通过build()函数实现,一般分为两种情况:一种是查找对应的服务是否被服务提供者注册为实例或者提供服务的匿名函数,如果是,则直接进行服务解析;第二种是服务名称没有响应的服务绑定,通过反射机制来动态创建服务。通过反射机制动态创建服务的过程可以分为两个步骤:第一步是通过放射机制获取服务类构造函数的信息,第二步是解决服务类构造函数的依赖问题。【判断是否存在构造函数,不存在直接实例化,存在则通过getParameters()来获取输入函数,并有相应的方法解决依赖参数问题,实现依赖注入。】

  1. 后期静态绑定

    • 同样的相关介绍,在《深入PHP:面向对象、模式与实践》中也有相关介绍,增加了一个后期延迟静态绑定的功能,用于继承范围引用静态调用的类
    • 在类的继承过程中,使用的类不再是当前类,而是调用的类,后期静态延迟绑定使用关键字static来实现,通过这种机制,“static::”不再解析未定义当前方法所在的类,而是在实际运行时计算得到的。即为运行时最初调用的类。
    • 后期延迟绑定还可以用于对象实例中。在对象实例化中static会根据运行时调用的类来决定实例化对象,而self是根据所在位置的类来决定实例化对象【更多实例,参见IlluminateEloquentModel类的代码,该类中使用了大量的后期静态绑定】
  2. 新特性
  3. trait

    • 单继承语言解决多继承问题方式(Ruby中通过混入类Mixin的方法解决)
    • 通过use 关键字添加到其他类的内部,增加了水平的特性的组合。

trait的一些特质

    1. 优先级:当前类的方式会覆盖trait中的方法,而trait中的方法会覆盖积累的方法
    2. 多个trait组合,通过逗号分隔
    3. 冲突解决:结局多个trait中插入了相同的方法,若没有明确解决冲突将会产生一个致命错误,解决该冲突,需要使用insteadof操作符来明确指定使用冲突方法中的哪一个,同时可以使用as操作符将其中一个冲突的方法以另一个名字来引入。
    4. 修改方法的访问控制:使用as语法调整方法的访问控制
    5. trait的抽象方法:在trait中可以使用抽象成员
    6. trait的静态成员:可以使用静态方法、静态变量
    7. trait的属性定义:可以定义属性
    1. 简化三元运算符

      • $var = (expr1)?(expr2):(expr3);
      • 从PHP5.3起,可以省略三元运算符的中间部分 $var = expr1 ? :expr3

    xiaoyu_v5
    34 声望0 粉丝